// 基于axios封装网络请求
import theAxios from 'axios'
import router from '@/router/index'
import { Notify } from 'vant'
import { getToken, removeToken, setToken } from '@/utils/token'
import { getNewTokenAPI } from '@/api'

const axios = theAxios.create({
  baseURL: 'http://geek.itheima.net',
  timeout: 10000// 设置超时时间20s
})

// 添加请求拦截器
axios.interceptors.request.use(
  function (config) { // 在发送请求之前做些什么
    // 统一携带token
    if (getToken()?.length > 0 && config.headers.Authorization === undefined) {
      config.headers.Authorization = `Bearer ${getToken()}`
    }
    return config
  },
  function (error) { // 对请求错误做些什么
    return Promise.reject(error)
  })

// 添加响应拦截器
axios.interceptors.response.use(
  function (response) { // 对响应数据做点什么
    return response
  },
  async function (error) { // 对响应错误做点什么
    // 当状态码为401时，需要重新登陆
    if (error.response.status === 401) {
      removeToken()// 清除token，才能让路由守卫判断失败，放行我去登陆
      // 方法1：清除token，强制跳转登录页，用户有感知
      // router.replace('/login')

      // 方法2：刷新token换回新的token，在继续使用，用户无感知
      const res = await getNewTokenAPI()
      setToken(res.data.data.token)// 更新的token存储到本地
      error.config.headers.Authorization = `Bearer ${res.data.data.token}`// 将新的token配置到请求体里面
      return axios(error.config)// 再一次发起请求
    } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations' && error.config.method === 'put') {
      // 当转态码为500时【refresh_token也过期】--重新登录
      Notify({ type: 'warning', message: '登陆身份已过期' })
      removeToken()
      localStorage.clear()// 清除本地存储所有的token
      router.replace('/login')
    }

    return Promise.reject(error)
  }
)

export default ({ url, method = 'GET', params = {}, data = {}, headers = {} }) => {
  return axios({
    url,
    method,
    params,
    data,
    headers
  })
// return new Promise
}

// 基于jq的$.ajax封装网络请求
// import $ from 'jquery'

// $.ajax({
//   url:'',
//   type:'',
//   data:{},
//   headers:{}
// })
// export default $.ajax
